package dao;

import hbt.HibernateUtil;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.List;








import negocio.Cotizacion;
import negocio.ItemCotizacion;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

import bean.CotizacionBean;
import bean.ProveedorBean;
import bean.RodamientoBean;
import dto.CotizacionDto;
import rmi.IPerCotizacion;

public class CotizacionDAO implements IPerCotizacion {

	private static CotizacionDAO instancia; 
	private SessionFactory sf; 
	private Session session; 
	
	
	public static CotizacionDAO getInstancia()
	{
		if(instancia==null)
			instancia=new CotizacionDAO(); 
		return instancia;
	}
	
	
	public CotizacionDAO()
	{
		sf = HibernateUtil.getSessionFactory();
	}
	
	private Session getSession(){
		if(session == null || !session.isOpen()){
			session = sf.openSession();
		}
		return session;
	}
	
	public void closeSession(){
		if (session.isOpen()) {
			session.close();
		}
	}
	@Override
	public void persist(CotizacionDto obj) throws RemoteException {
		CotizacionDAO dao= CotizacionDAO.getInstancia();
		
		CotizacionBean cbean=new CotizacionBean(obj);
		cbean.setEstado("estado");
		//sf = HibernateUtil.getSessionFactory();
		//CotizacionBean cbean=new CotizacionBean();
		//cbean.setCliente(cliente);
		session = dao.getSession();
		session.beginTransaction();
		session.persist(cbean);
		session.getTransaction().commit();

	}

	@Override
	public void persistList(List<CotizacionDto> lista) throws RemoteException {
		Session session = getSession();
		session.beginTransaction();
		for(Object e : lista){
			session.saveOrUpdate(e);
		}
		session.flush();
		session.getTransaction().commit();

	}

	@Override
	public CotizacionDto get(String numero) throws RemoteException {
		Session session = getSession();
		return (CotizacionDto) session.get(CotizacionBean.class,  numero);
	}

	//TODO terminar el hql
	public Cotizacion cotizar(Cotizacion c)
	{
		CotizacionDAO dao= CotizacionDAO.getInstancia();
		Session session=dao.getSession();
		for(ItemCotizacion i: c.getItems())
		{
			//Codigo= sufijo
			
			RodamientoBean r= (RodamientoBean) session.createQuery("select * from rodamiento r where r.codigo=:codigo order by r.monto")
					.setString("codigo", i.getRodamiento().getCodigo()).uniqueResult();
				i.getRodamiento().setCaracteristicas(r.getCaracteristicas());
				//i.getRodamiento().setMarca(r.getMarca());
				i.getRodamiento().setOrigen(r.getOrigen());
				i.getRodamiento().setSerie(r.getSerie());
				i.getRodamiento().setMedida(r.getMedida());
				i.getRodamiento().setIdRodamiento(r.getIdRodamiento());
				i.getRodamiento().setTipo(r.getTipo());
				//ProveedorBean p= (ProveedorBean) session.createQuery("select * from proveedor p join rodamiento r where r.idrodamiento=:id").setInteger("id", r.getIdRodamiento());
				i.getRodamiento().setMonto(r.getMonto());		
				
			//ver como agregar un proveedor a la cotizacion...
		}
		
		
		return c;
		
	}
}

